package org.xx.armory.swing.components;

import org.xx.armory.swing.builders.UIModelClass;

import javax.swing.*;
import java.math.BigDecimal;
import java.util.Date;

/**
 * 输入对话框。
 */
@UIModelClass
public class LineInputDialog
        extends DialogPane {
    public static final int TEXT = 1;
    public static final int PASSWORD = 2;
    public static final int NUMBER = 3;
    public static final int PERCENT = 4;
    public static final int CURRENCY = 5;
    public static final int DATE = 6;

    private static final int DEFAULT_VALUE_COLUMNS = 32;

    public LineInputDialog(
            String prompt,
            int valueType,
            Object defaultValue
    ) {
        controller().hide("textValue");
        controller().hide("passwordValue");
        controller().hide("numberValue");
        controller().hide("percentValue");
        controller().hide("currencyValue");
        controller().hide("dateValue");

        final JTextField valuePane;
        switch (valueType) {
            case TEXT:
                valuePane = controller().get(JTextField.class, "textValue");
                if (defaultValue != null) {
                    controller().setText("textValue", defaultValue.toString());
                }
                break;
            case PASSWORD:
                valuePane = controller().get(JTextField.class, "passwordValue");
                if (defaultValue != null) {
                    controller().setText("passwordValue", defaultValue.toString());
                }
                break;
            case NUMBER:
                valuePane = controller().get(JTextField.class, "numberValue");
                if (defaultValue != null) {
                    if (defaultValue instanceof Number) {
                        controller().setNumber("numberValue", ((Number) defaultValue).longValue());
                    } else {
                        throw new IllegalArgumentException("defaultValue should be Number, but " + defaultValue.getClass());
                    }
                }
                break;
            case PERCENT:
                valuePane = controller().get(JTextField.class, "percentValue");
                if (defaultValue != null) {
                    if (defaultValue instanceof Number) {
                        controller().setFloat("percentValue", ((Number) defaultValue).doubleValue());
                    } else {
                        throw new IllegalArgumentException("defaultValue should be Number, but " + defaultValue.getClass());
                    }
                }
                break;
            case CURRENCY:
                valuePane = controller().get(JTextField.class, "currencyValue");
                if (defaultValue != null) {
                    if (defaultValue instanceof BigDecimal) {
                        controller().setDecimal("currencyValue", (BigDecimal) defaultValue);
                    } else if (defaultValue instanceof Number) {
                        controller().setDecimal("currencyValue", new BigDecimal(((Number) defaultValue).doubleValue()));
                    } else {
                        throw new IllegalArgumentException("defaultValue should be Number, but " + defaultValue.getClass());
                    }
                }
                break;
            case DATE:
                valuePane = controller().get(JTextField.class, "dateValue");
                if (defaultValue != null) {
                    if (defaultValue instanceof Date) {
                        controller().setDate("dateValue", (Date) defaultValue);
                    } else {
                        throw new IllegalArgumentException("defaultValue should be Date, but " + defaultValue.getClass());
                    }
                }
                break;
            default:
                throw new IllegalArgumentException("unknown value type: " + valueType);
        }

        valuePane.setColumns(getValueColumns());
        valuePane.setVisible(true);
        final int preferredWidth = valuePane.getPreferredSize().width;

        controller().setText("prompt",
                             "<html><body style=\"margin:0;padding:0;width:" + preferredWidth + "px;\" >" + prompt + "</body></html>");
    }

    protected int getValueColumns() {
        return DEFAULT_VALUE_COLUMNS;
    }

    /**
     * 获取输入的文本内容。
     *
     * @return 用户输入的文本内容，如果用户没有点击确认则返回{@code null}。
     */
    public String getTextResult() {
        return getResult() == DialogPane.OK ? controller().getText("textValue") : null;
    }

    /**
     * 获取输入的密码内容。
     *
     * @return 用户输入的密码内容，如果用户没有点击确认则返回{@code null}。
     */
    public String getPasswordResult() {
        return getResult() == DialogPane.OK ? controller().getText("passwordValue") : null;
    }

    /**
     * 获取输入的数量内容。
     *
     * @return 用户输入的数量内容，如果用户没有点击确认则返回{@code null}。
     */
    public Long getNumberResult() {
        return getResult() == DialogPane.OK ? controller().getNumber("numberValue") : null;
    }

    /**
     * 获取输入的百分比内容。
     *
     * @return 用户输入的百分比内容，如果用户没有点击确认则返回{@code null}。
     */
    public Double getPercentResult() {
        return getResult() == DialogPane.OK ? controller().getFloat("percentValue") : null;
    }

    /**
     * 获取输入的金额内容。
     *
     * @return 用户输入的金额内容，如果用户没有点击确认则返回{@code null}。
     */
    public BigDecimal getCurrencyResult() {
        return getResult() == DialogPane.OK ? controller().getDecimal("currencyValue") : null;
    }

    /**
     * 获取输入的日期内容。
     *
     * @return 用户输入的日期内容，如果用户没有点击确认则返回{@code null}。
     */
    public Date getDateResult() {
        return getResult() == DialogPane.OK ? controller().getDate("dateValue") : null;
    }
}
